;> Command
EDITLINE LDR R3,[AP,#START]
 LDR R2,[AP,#GS]
 MOV R7,#1
EDITL1 LDRB R0,[R3],#1
 TEQ R0,#TERM
 ADDEQ R7,R7,#1
 CMP R3,R2
 BCC EDITL1
 BL PROMPT
 = "At line ",0
 BL NUMOUT
 BL VSTRNG
 = " (character ",0
 LDR R7,[AP,#GS]
 LDR R6,[AP,#START]
 SUB R7,R7,R6
 LDRB R6,[AP,#X]
 ADD R7,R7,R6
 BL NUMOUT
 BL VSTRNG
 = "), new line:",0
 BL SELFWD
 BL READLRNOCOPY
 ADD R2,ARGP,#STRACC
 MOV UPDATE,#FULLSCREEN
;entry here from NEXTLN
EDITL0 MOV R3,#0
 MOV R7,#0
EDITL2 LDRB R0,[R2],#1
 TEQ R0,#" "
 BEQ EDITL2
 TEQ R0,#"+"
 BEQ EDTRP
 TEQ R0,#"-"
 BEQ EDTRM
 TEQ R0,#"M"
 TEQNE R0,#"m"
 BEQ EDITGM
 BL GETDEC
 TEQ R3,#0
 BEQ EDITBN
 MOV R8,R7
 SUBS R7,R7,#1
 BEQ STFIL2
 BCC EDITNL
 LDR R4,[AP,#START]
 LDR R2,[AP,#GS]
EDITL5 TEQ R4,R2
 BEQ EDITL6
 LDRB R0,[R4],#1
 TEQ R0,#TERM
 SUBEQS R7,R7,#1
 BNE EDITL5
 BL GPBACK
 B EDITL9
EDITL6 LDR R4,[AP,#GE]
 LDR R2,[AP,#END]
EDITL7 TEQ R4,R2
 BEQ EDITNL
 LDRB R0,[R4],#1
 TEQ R0,#TERM
 SUBEQS R7,R7,#1
 BNE EDITL7
 BL GPFWD
EDITL9 MOV R6,#0
EDITLX STRB R6,[AP,#X]
 LDRB R7,[AP,#TSM]
 STRB R7,[AP,#Y]
 B EDITST
EDITBN BL MSG
 = "Bad number",0
 ALIGN
EDITNL BL MSG
 = "Line not found",0
 ALIGN
BADMNO BL MSG
 = "Bad mark number",0
 ALIGN
EDITGM LDRB R0,[R2],#1
 TEQ R0,#" "
 BEQ EDITGM
 SUBS R0,R0,#"1"
 BCC BADMNO
 CMP R0,#2
 BCS BADMNO
 LDRB R1,[R2],#1
 CMP R1,#" "
 BHI BADMNO
;go to mark number in R0 (0,1)
GOMARK LDRB R1,[AP,#MARKS]
 CMP R0,R1
 BCS BADMNO
 ADD R14,AP,R0,LSL #2
 LDR R4,[R14,#MARKTB]
 BL MARKADR
 BL GPTO
 BL NORMAL
 STRB R6,[AP,#X]
 MOV UPDATE,#FULLSCREEN
 B EDITST
;convert character number to position: CS if GE or later
MARKADR STMFD SP!,{R0,R1}
 LDR R0,[AP,#START]
 LDR R1,[AP,#GS]
 SUB R1,R1,R0
 SUBS R1,R4,R1
 LDRCS R0,[AP,#GE]
 MOVCS R4,R1
 ADD R4,R4,R0
 LDMFD SP!,{R0,R1}
 MOV PC,R14
EDTRP BL GETNEW
 TEQ R3,#0
 BEQ EDITBN
 LDR R4,[AP,#GE]
 LDRB R0,[AP,#X]
 ADD R4,R4,R0
 ADD R4,R4,R7
 LDR R3,[AP,#END]
 CMP R4,R3
 BHI RELMERR
 BL GPFWD
 BL NORMAL
 B EDITLX
EDTRM BL GETNEW
 TEQ R3,#0
 BEQ EDITBN
 LDRB R0,[AP,#X]
 SUBS R7,R0,R7
 BPL EDTRM1
 LDR R4,[AP,#GS]
 ADD R4,R4,R7
 LDR R3,[AP,#START]
 CMP R3,R4
 BHI RELMERR
 BL GPBACK
 BL NORMAL
 B EDITLX
EDTRM1 MOV UPDATE,#NONE+ABORT
 STRB R7,[AP,#X]
 B EDITST
RELMERR BL MSG
 = "Relative move out of file",0
 ALIGN
GETNEW LDRB R0,[R2],#1
GETDEC CMP R0,#"9"
 MOVHI PC,R14
 SUBS R0,R0,#"0"
 MOVCC PC,R14
 ADD R7,R7,R7,LSL #2
 ADD R7,R0,R7,LSL #1
 MOV R3,#1
 B GETNEW
NUMOUT STMFD SP!,{R14}
 BL SELREV
 MOV R4,#0
 MOV R3,#6
 ADR R5,VALUES
NUMLOP MOV R0,#"0"
 LDR R6,[R5,R3,LSL #2]
NUMLP SUBS R7,R7,R6
 ADDCS R0,R0,#1
 BCS NUMLP
 ADD R7,R7,R6
 CMP R0,#"0"
 MOVNE R4,#1
 TEQ R4,#1
 TEQNE R3,#0
 BEQ NUMLPA
 TEQ R4,#0
 BEQ NUMLPB
NUMLPA SWI WRITEC
NUMLPB SUBS R3,R3,#1
 BCS NUMLOP
 LDMFD SP!,{PC}
VALUES & 1
 & 10
 & 100
 & 1000
 & 10000
 & 100000
 & 1000000
 & 10000000
EDSTAR BL RETSCR
 LDRB R0,[ARGP,#TASK]
 TEQ R0,#0
 BEQ FTASK0
 SWI WRITES
 = "Warning: there is a background task running, don't hurt it!",10,13,0
 ALIGN
FTASK0 MOV R0,#0
 MOV R1,#0
 MOV R2,#0
 MOV R3,#2
 MOV R4,#0
 MOV R5,#0
 MOV R6,#0
 MOV R7,#0
 SWI SETENV
 ADD R3,ARGP,#MSTACK
 STMIA R3,{R0,R1,R2,R4,R5,R6,R7}
 MOV R0,#1
 STRB R0,[ARGP,#ERRCTL]
STAREX MOV R0,#&87
 SWI BYTE
 AND R5,R2,#7
 MOV R0,#&EC
 MOV R1,#16
 MOV R2,#&EF
 SWI BYTE ;clear spool capability and get status to r1
 CMP R5,#7
 BEQ CLIPT1
 BL PATOUT
 = &FF,&0D,&0D,&0D,&0D,&0D,&0D,&0D
 = &F4,&54,&00,&30,&33,&37,&3C,&38
 = &00,&00,&00,&06,&0C,&98,&F0,&60
 = &00,&60,&00,&66,&67,&66,&66,&66
 = &00,&00,&01,&E0,&30,&30,&31,&30
 = &00,&30,&B6,&FC,&78,&FC,&B6,&30
 B CLIPT2
CLIPT1 SWI WRITES
 = 132,157,135,"T*",156,0
 ALIGN
CLIPT2 MOV R0,#3
 SWI BYTE ;reset output status
 BL INITUS
 SUB R0,SP,#256
 MOV R1,#255
 MOV R2,#" "
 MOV R3,#255
 SWI READLINE
 BCS FTASKESC
 LDRB R1,[R0]
 TEQ R1,#CR
 BEQ FTASKQ
GCALCALL BL SETSTART
 ADR R0,FTASKX
 MOV R2,#0
 MOV R3,#2
 MOV R4,#0
 MOV R5,#0
 MOV R6,#0
 MOV R7,#0
 SWI SETENV
 SUB R0,SP,#256
 SWI CLI
FTASKX TSTP PC,#0
 BL SETARGP
 LDR SP,[ARGP,#HIMEM]
 BL FTASKR
 LDR AP,[ARGP,#USINGAP]
 BL INITHAN
 MOV R0,#5
 SUB R1,SP,#16
 MOV R2,#&FF
 STR R2,[R1]
 SWI WORD
 LDRB R3,[R1,#4]
 MOV R0,#&7E
 SWI BYTE
 TST R3,#&80
 BEQ STAREX
 SWI WRITES
 = "Escape",10,13,0
 B STAREX
FTASKQ BL INITED
 BL SETARGP
 LDR SP,[ARGP,#HIMEM]
 LDR AP,[ARGP,#USINGAP]
 BL FTASKR
 BL INITHAN
 MOV R0,#0
 STRB R0,[ARGP,#ERRCTL]
REENTER BL VSTRNG
 = 4,3,15,13,26,0
 MOV R0,#&87
 SWI BYTE
 LDRB R0,[ARGP,#TUTMODE+1]
 EOR R2,R2,R0
 ANDS R2,R2,#&3F
 SWINE WRITEI+22
 SWINE WRITEC
 BL SCRIMI
 B EDITAL
FTASKESC BL SETARGP
 BL FTASKR
 MOV R0,#&7E
 SWI BYTE
 B ESCAPE
FTASKR ADD R3,ARGP,#MSTACK
 LDMIA R3,{R0,R1,R2,R4,R5,R6,R7}
 MOV R3,#2
 SWI SETENV
 MOV PC,R14
YESNO MOV R3,#"Y"
YESNO1 MOV R0,#&81
 MOV R1,#&81
 MOV R2,#3
 SWI BYTE
YESNO2 TEQ R2,#0
 BNE EDITST
 AND R2,R1,#&DF
 TEQ R2,#"N"
 BEQ EDITST
 TEQ R2,#"Y"
 TEQNE R1,R3
 MOVEQ PC,R14
 BL MSG
 = "Invalid option to continue prompt",0
 ALIGN
LOADFILE LDRB R0,[AP,#MODIFY]
 TST R0,#1
 BEQ LOADF1
 MOV R0,#19
 BL PRMPTX
 = "Overwrite text [Y,f2/N]:",0
 MOV R3,#128+2
 BL YESNO1
 MOV R0,#4
 STRB R0,[AP,#MODIFY]
LOADF1 BL PROMPT
 = "Type filename to load:",0
 BL READFL
 BL INFILE
 BEQ NONAME
 BL LOADF2
LOADFEND MOV R0,#0 ;called from pathload
 STRB R0,[AP,#X]
 STRB R0,[AP,#Y]
 STRB R0,[AP,#MODIFY]
 STRB R0,[AP,#MARKS]
 BL SCRIMI
 MOV UPDATE,#FULLSCREEN
 B EDITST
READLRNOCOPY MOV R4,#0
 B READLR
;read filename into STRACC
READFL ADD R4,AP,#NAMBUFF
READLR MOV R2,#53
;read line into STRACC, R2 maximum length
;If R4<>0 then COPY copies chars pointed to by R4
;exit with R1 pointing to carriage return
;If R5<>0 then shift-COPY copies chars pointed to by R5
READLS SWI WRITEI+32
READLN ADD R5,ARGP,#STRACC
READLQ CMP R2,#88
 MOVCS R2,#88
 ADD R1,ARGP,#STRACC
 ADD R2,R2,R1
 STMFD SP!,{R14}
RDLN1 SWI READC
 BCS ESCAPE
 TEQ R0,#&7F
 BNE RDLN2
 SUB R1,R1,ARGP
 TST R1,#&FF
 ADD R1,R1,ARGP
 SWINE WRITEC
 SUBNES R1,R1,#1
 B RDLN1
RDLN2 TEQ R0,#&15
 BNE RDLN3
RDLN4 SUB R1,R1,ARGP
 TST R1,#&FF
 ADD R1,R1,ARGP
 BEQ RDLN1
 SWI WRITEI+127
 SUB R1,R1,#1
 B RDLN4
RDLN3 MOV R3,R4
 TEQ R0,#&8B
 MOVNE R3,R5
 TEQNE R0,#&8B+16
 BNE RDLN5
 TEQ R3,#0
 BEQ RDLN5
 LDRB R0,[R3],#1
 TEQ R0,#CR
 SWIEQ WRITEI+7
 BEQ RDLN1
RDLN6 TEQ R1,R2
 SWIEQ WRITEI+7
 BEQ RDLN1
 STRB R0,[R1],#1
 BL CHOUT
 LDRB R0,[R3],#1
 TEQ R0,#CR
 BNE RDLN6
 B RDLN1
RDLN5 TEQ R0,#LF
 MOVEQ R0,#CR
 TEQ R0,#CR
 STRB R0,[R1]
 LDMEQFD SP!,{PC}
 TEQ R1,R2
 SWIEQ WRITEI+7
 BEQ RDLN1
 STRB R0,[R1],#1
 BL CHOUT
 B RDLN1
;load file in stracc
LOADF2 STMFD SP!,{R14}
 LDR R7,[AP,#END]
 LDR R6,[AP,#START]
 BL PROMPT
 = "Loading ",0
 BL WRITNAM
 BL SELFWD
 MOV R0,#5
 SWI FILE
 TEQ R0,#0
 BEQ LOADFN
 TEQ R0,#2
 BEQ LOADFB
 SUBS R2,R7,R4 ;load addr:=<desired end>-length
 BCC NOROOM
 CMP R6,R2
 BHI NOROOM
 MOV R0,#&FF
 ADD R1,ARGP,#STRACC
 MOV R3,#0
 SWI FILE
 STR R2,[AP,#FLLOAD]
 STR R3,[AP,#FLEXEC]
 SUB R4,R7,R4 ;r4 becomes loaded address
 STR R4,[AP,#GE]
 STR R6,[AP,#GS]
; BL INFILE
 BL MOVNAM
 LDMFD SP!,{PC}
;write file name
WRITNAM ADD R1,ARGP,#STRACC
WRITNAM1 STMFD SP!,{R1,R14}
 BL SELREV
WRNAM0 LDRB R0,[R1],#1
 TEQ R0,#" "
 BEQ WRNAM0
 SUB R1,R1,#1
WRNAM1 LDRB R0,[R1],#1
 TEQ R0,#CR
 SWINE WRITEC
 BNE WRNAM1
 LDMFD SP!,{R1,PC}
;Move name into nambuff
MOVNAM ADD R2,AP,#NAMBUFF
;Move string in STRACC to area pointed to by R2
MOVBUF ADD R1,ARGP,#STRACC
;Move string ptd to by R1 to area ptd to by R2. Remove spaces
MOVNM0 LDRB R0,[R1],#1
 TEQ R0,#" "
 BEQ MOVNM0
 SUB R1,R1,#1
;Move string ptd to by R1 to area ptd to by R2
MOVNM1 LDRB R0,[R1],#1
 STRB R0,[R2],#1
 TEQ R0,#CR
 BNE MOVNM1
 MOV PC,R14
NOROOM BL MSG
 = "No room",0
 ALIGN
NONAME BL MSG
 = "No infile name found",0
 ALIGN
LOADFN BL MSG
 = "File not found",0
 ALIGN
LOADFB BL MSG
 = "Object is a directory",0
 ALIGN
;find infile name if STRACC contains nothing at all
;text must be normalised i.e. gap at a line position
;returns ne if name found
INFILE SUB R2,R1,ARGP
 TEQ R2,#STRACC
 MOVNE PC,R14
 MOV R2,#128
 LDR R1,[AP,#START]
 LDR R6,[AP,#GS]
 CMP R1,R6
 LDREQ R1,[AP,#GE]
 LDRB R0,[R1]
 CMP R0,#TERM
 BNE INFIL1
 ADD R1,R1,#1
 CMP R1,R6
 LDREQ R1,[AP,#GE]
INFIL1 LDRB R0,[R1],#1
 SUBS R2,R2,#1
 CMPNE R0,#TERM
 BEQ INFIL9
 CMP R0,#">"
 BNE INFIL1
 ADD R2,ARGP,#STRACC
INFIL2 LDRB R0,[R1],#1
 CMP R0,#" "
 BEQ INFIL2
 CMP R0,#TERM
 BEQ INFIL9
 MOV R3,#54
 MOV R4,#0
INFIL3 STRB R0,[R2],#1
 SUBS R3,R3,#1
 BEQ INFIL4
 CMP R0,#""""
 EOREQ R4,R4,#1 ;flip in quote flag
 LDRB R0,[R1],#1
 CMP R0,#" "
 CMPLE R4,#0
 BLE INFIL4
 CMP R0,#TERM
 BNE INFIL3
INFIL4 MOVS R0,#CR ;ne if name found
 STRB R0,[R2],#1
INFIL9 MOV PC,R14
;stop cursor from being in virtual spaces area. Returns length in R2
TRAPC STMFD SP!,{R14,R4}
 BL LENGTH
 MOV R2,R0
 LDRB R1,[AP,#X]
 CMP R0,R1
 LDMCSFD SP!,{PC,R4}
 STRB R0,[AP,#X]
 BL CSRXY
 LDMFD SP!,{PC,R4}
;show the cursor position for marked save, marked replace, print
DISPC STMFD SP!,{R14}
 BL TOONEMK
 LDMFD SP!,{R14}
 MOVNE PC,R14 ;if not marked
DISPC2 STMFD SP!,{R14}
 BL TRAPC
 LDRB R0,[AP,#X]
 CMP R0,R2 ;test X posn of mark with line length
 BCC DISPC3
 LDRB R1,[AP,#Y]
 LDRB R14,[AP,#SLINE]
 ADD R1,R1,R14
 ADD R14,R1,#SCRIM
 ADD R0,R0,#1
 STRB R0,[ARGP,R14] ;if mark past end of line, update length
DISPC3 MOV R0,#"c"
 BL CHOUTI
 MOV UPDATE,#FULLSCREEN
 LDMFD SP!,{PC}
SAVEBLIP = 1,0,-10,-1,200,0,2,0
SAVEFILE BL DISPC
 LDRB R4,[AP,#MARKS]
 TEQ R4,#1
 BEQ MKSAVE
 BL PROMPT
 = "Type filename to save:",0
 MOV R0,#7
 ADR R1,SAVEBLIP
 SWI WORD
 BL READFL
 BL INFILE
 BEQ NONAME
 BL PROMPT
 = "Saving ",0
 BL WRITNAM
 LDR R4,[AP,#GE]
 STMFD SP!,{R4}
 LDR R4,[AP,#START]
 BL GPBACK
 BL DATEST
 LDR R4,[AP,#GE]
 LDR R5,[AP,#END]
 SWI FILE
 LDMFD SP!,{R4}
 BL GPFWD
 BL MOVNAM
 MOV R0,#0
 STRB R0,[AP,#MODIFY]
 BL SCRIMI
 MOV UPDATE,#FULLSCREEN
 B EDITST
MKSAVE BL PROMPT
 = "MARK to CURSOR save:",0
 BL READFL
 BL PROMPT
 = "Saving section to ",0
 BL WRITNAM
 BL GPFINE
 BL DATEST
 LDR R4,[AP,#MARKTB]
 BL MARKADR
 LDR R5,[AP,#GS]
 MOVCS R5,R4
 LDRCS R4,[AP,#GE]
 SWI FILE
 BL NORMAL
 BL SCRIMI
 B CLEARMARKS
FIND BL PROMPT
 = "Find and replace:",0
 ADD R4,ARGP,#FRBUFF
 ADD R5,ARGP,#GRBUFF
 BL FINDRT
 BL TRAPC
 SWI WRITEI+31
 SWI WRITEI+0
 LDRB R1,[AP,#ELINE]
 LDRB R0,[AP,#SLINE]
 SUB R0,R1,R0
 SWI WRITEC
 BL SELREV
 BL VSTRNG
 = "Searching for:",0
 BL SELFWD
 SWI WRITEI+" "
 ADD R2,ARGP,#STRACC
FINDS1 LDRB R0,[R2],#1
 TEQ R0,#CR
 BEQ FINDS2
 BL FINDREADOUT
 B FINDS1
FINDS2 BL QWIPE
 BL GPFINE
 LDR R5,[AP,#GE]
FIND0 LDR R6,[AP,#END]
 BL SEARCH
 BCS FIND2
 STMFD SP!,{R4,R5}
 BL GPFWD
 BL NORMAL
 STRB R6,[AP,#X]
 LDRB R0,[AP,#Y]
 LDRB R1,[AP,#BSM]
 ADD R0,R0,#2
 CMP R0,R1
 STRCCB R1,[AP,#Y]
 MOV UPDATE,#FULLSCREEN+ABORT
 BL CUROFF
 BL REDRAW
 BL PROMPT
 = "C(ontinue), E(nd of file replace), R(eplace), L(ast Replace) or ESCAPE/RETURN",0
 MOV UPDATE,#NONE+ABORT
 LDMFD SP!,{R4,R5}
 BL CSRXY
 BL CURON
 TST R7,#1
 MOV R0,R7,LSR #8
 BNE FIND4A
FIND4 BL BIGCUR
 SWI READC
 BL NMLCUR
 BCS ESCAPE
FIND4A CMP R0,#&7F
 BCS FINDSP ;command
 TEQ R0,#CR
 BEQ EDITST
 BIC R0,R0,#&20
 TEQ R0,#"C"
 ADDEQ R5,R4,#1
 BEQ FIND0
 TEQ R0,#"E"
 BEQ FINDEND
 TEQ R0,#"L"
 BEQ FINDLAST
 TEQ R0,#"R"
 BNE FIND4
 TST FLAGR,#REPLFLAG
 BNE FINDR1
 BL PROMPT
 = "Replace with:",0
 STMFD SP!,{R4,R5}
 ADD R4,ARGP,#STRACC
 BL READLR
 ADD R7,ARGP,#STRACC
 LDR R8,[ARGP,#REPADR]
 BL REPLTR
 LDMFD SP!,{R4,R5}
FINDR1 LDRB R0,[AP,#MARKS]
 TEQ R0,#0
 BNE TOOMARK
 BL REPLACE
 B FIND0
FINDEND TST FLAGR,#REPLFLAG
 BNE FINDEND1
 BL PROMPT
 = "Replace with:",0
 STMFD SP!,{R4,R5}
 BL READLRNOCOPY
 ADD R7,ARGP,#STRACC
 LDR R8,[ARGP,#REPADR]
 BL REPLTR
 LDMFD SP!,{R4,R5}
FINDEND1 LDRB R0,[AP,#MARKS]
 TEQ R0,#0
 BNE TOOMARK
 BL REPLACE
 LDR R8,[AP,#GS]
 STMFD SP!,{R8}
 LDR R6,[AP,#END]
FINDEND2 BL SEARCH
 BLCC REPLACE ;replace if found
 CMP R5,R6
 BCC FINDEND2
 LDMFD SP!,{R4}
 BL GPBACK
 BL NORMAL
 MOV UPDATE,#FULLSCREEN+ABORT
 B EDITST
FINDLAST TST FLAGR,#REPLFLAG
 BNE FINDLAST1
 BL PROMPT
 = "Replace with:",0
 STMFD SP!,{R4,R5}
 BL READLRNOCOPY
 ADD R7,ARGP,#STRACC
 LDR R8,[ARGP,#REPADR]
 BL REPLTR
 LDMFD SP!,{R4,R5}
FINDLAST1 LDRB R0,[AP,#MARKS]
 TEQ R0,#0
 BNE TOOMARK
 BL REPLACE
 BL NORMAL
 MOV UPDATE,#FULLSCREEN+ABORT
 B EDITST
FIND2 BL NORMAL
 BL STATUS
 BL INFORR
 = " Not found",0
 B EDITOR
FINDSP STMFD SP!,{R0}
 BL STATUS
 LDMFD SP!,{R0}
 B EDITXX
GLOBAL BL DISPC ;dispc will set fullscreen if it's rqd
 BL PROMPT
 = "Global replace:",0
 ADD R4,ARGP,#GRBUFF
 ADD R5,ARGP,#FRBUFF
 BL FINDRT
 TST FLAGR,#REPLFLAG
 BEQ GLOBSN
 LDR R8,[ARGP,#REPADR]
 LDRB R0,[R8]
 TEQ R0,#TERMSYM
 BNE GLOBSN
 BL PROMPT
 = "Delete the text found [Y,f5/N]:",0
 MOV R3,#128+5
 BL YESNO1
GLOBSN LDRB R0,[AP,#MARKS]
 TEQ R0,#1
 BNE GLOB2
;mark to cursor
 BL GPFINE
 MOV R8,#0 ;set r8 for a normalise to occur after work
 STRB R8,[AP,#MARKS]
 LDR R5,[AP,#GE]
 LDR R4,[AP,#MARKTB]
 BL MARKADR
 MOV R6,R4
 CMP R5,R6
 BCC GLOBC0 ;cursor before mark is ok
 MOV R8,R5
 BL GPBACK
 LDR R5,[AP,#GE]
 MOV R6,R8
 B GLOBC0
;whole file
GLOB2 LDR R8,[AP,#GE] ;position to restore to
 LDR R4,[AP,#START]
 BL GPBACK ;make file into a lump
 LDR R5,[AP,#GE]
 LDR R6,[AP,#END]
GLOBC0 TST FLAGR,#REPLFLAG
 MOV R9,#0 ;r9 is flagr and used for counting
 BNE GLOBSR ;if no replace part, just counting
 STMFD SP!,{R5,R6,R8,R9}
 BL STATUS
 BL INFORR
 = "Counting...",0
 LDMFD SP!,{R5,R6,R8,R9}
 MOV R4,R5
;global count from r5 to r6
GLOBC1 BL SEARCH
 ADDCC R9,R9,#1 ;found
; ADDCS R5,R4,#1 ;if failed slide
 CMP R5,R6
 BCC GLOBC1
 BL GLOBRT
 MOVS R7,R9
 BEQ GLOBE2
 BL NUMOUT
 B GLOBE3
GLOBE2 BL VSTRNG
 = "None",0
 ALIGN
GLOBE3 BL VSTRNG
 = " found",0
 B GLOBSX
GLOBSR STMFD SP!,{R5,R6,R8,R9}
 BL STATUS
 BL INFORR
 = "Replacing...",0
 LDMFD SP!,{R5,R6,R8,R9}
;global replace from r5 to r6
GLOBS1 BL SEARCH
 ADDCC R9,R9,#1 ;found
 BLCC REPLACE
 CMP R5,R6
 BCC GLOBS1
 BL GLOBRT
 MOVS R7,R9
 BEQ GLOBE2
 BL NUMOUT
 BL VSTRNG
 = " replaced",0
GLOBSX BL QWIPE
 B EDITOR
;restore positions after global work
GLOBRT STMFD SP!,{R14}
 MOVS R4,R8
 BLNE GPTO
 BL NORMAL
 BL STATUS
 LDMFD SP!,{R14}
MESSPOS SWI WRITEI+31
 SWI WRITEI+WIDTH-18
 LDRB R1,[AP,#ELINE]
 LDRB R0,[AP,#SLINE]
 SUB R0,R1,R0
 SWI WRITEC
 SWI WRITEI+17
 SWI WRITEI+0
 SWI WRITEI+17
 SWI WRITEI+7+128
 SWI WRITEI+" "
 MOV PC,R14
;routine to get input for find and global
FINDRT STMFD SP!,{R14,R4}
 SWI WRITEI+32
 ADD R1,ARGP,#STRACC
 ADD R2,R1,#80
FINDREAD1 SWI READC
 BCS ESCAPE
 TEQ R0,#&7F
 BNE FINDREAD2
 SUB R1,R1,ARGP
 TST R1,#&FF
 ADD R1,R1,ARGP
 BEQ FINDREAD1
 LDRB R0,[R1,#-1]!
 STMFD SP!,{R1,R2}
 BL FINDMETA
 CMP R2,#0
 MOVEQ R2,#1
 LDRNEB R2,[R1],#1
FINDDELCHAR SWI WRITEI+127
 SUBS R2,R2,#1
 BNE FINDDELCHAR
 LDMFD SP!,{R1,R2}
 B FINDREAD1
FINDREAD2 TEQ R0,#&15
 BNE FINDREAD3
FINDREAD4 SUB R1,R1,ARGP
 TST R1,#&FF
 ADD R1,R1,ARGP
 BEQ FINDREAD1
 LDRB R0,[R1,#-1]!
 STMFD SP!,{R1,R2}
 BL FINDMETA
 CMP R2,#0
 MOVEQ R2,#1
 LDRNEB R2,[R1],#1
FINDDELCHAR2 SWI WRITEI+127
 SUBS R2,R2,#1
 BNE FINDDELCHAR2
 LDMFD SP!,{R1,R2}
 B FINDREAD4
FINDREAD3 MOV R3,R4
 TEQ R0,#&8B
 MOVNE R3,R5
 TEQNE R0,#&8B+16
 BNE FINDREAD5
 TEQ R3,#0
 BEQ FINDREAD5
 LDRB R0,[R3],#1
 TEQ R0,#CR
 SWIEQ WRITEI+7
 BEQ FINDREAD1
FINDREAD6 TEQ R1,R2
 SWIEQ WRITEI+7
 BEQ FINDREAD1
 STRB R0,[R1],#1
 BL FINDREADOUT
 LDRB R0,[R3],#1
 TEQ R0,#CR
 BNE FINDREAD6
 B FINDREAD1
FINDREAD5 TEQ R0,#LF
 MOVEQ R0,#CR
 TEQ R0,#CR
 STRB R0,[R1]
 BEQ FINDREADX
 TEQ R1,R2
 SWIEQ WRITEI+7
 BEQ FINDREAD1
 STRB R0,[R1],#1
 BL FINDREADOUT
 B FINDREAD1
FINDREADX ADD R1,ARGP,#STRACC
 LDRB R0,[R1]
 TEQ R0,#CR
 BNE FIND1
 LDMFD SP,{R2}
 LDRB R0,[R2]
 TEQ R0,#CR
 BEQ NOPREV
 MOV R1,R2
 ADD R2,ARGP,#STRACC
 BL MOVNM1
FIND1 LDMFD SP!,{R2}
 ADD R1,ARGP,#STRACC
 BL MOVNM1
 BL SCRIMI
 BL FINDTR
 LDMFD SP!,{PC}
NOPREV BL MSG
 = "No previous string",0
 ALIGN
FINDREADOUT CMP R0,#128
 BCC CHOUT
 STMFD SP!,{R0,R1,R2,R14}
 BL FINDMETA
 CMP R2,#0
 LDMEQFD SP!,{R0,R1,R2,R14}
 BEQ CHOUT
 BL SELREV
 LDRB R2,[R1],#1
METAOUT1 LDRB R0,[R1],#1
 SWI WRITEC
 SUBS R2,R2,#1
 BNE METAOUT1
 BL SELFWD
 LDMFD SP!,{R0,R1,R2,PC}^
FINDMETA ADR R1,METATABLE
FINDMETA1 LDRB R2,[R1],#1
 CMP R2,#0
 TEQNE R2,R0
 MOVEQ PC,R14
 LDRB R2,[R1],#1
 ADD R1,R1,R2
 B FINDMETA1
METATABLE = 128,7,"Newline"
 = 128+1,6,"Field#"
 = 128+2,5,"Found"
 = 128+3,4,"Most"
 = 128+4,4,"Many"
 = 128+5,4," by "
 = 128+6,3,"Not"
 = 128+7,3,"Any"
 = 128+8,5,"Alpha"
 = 128+9,6,"Number"
 = 128+16+0,4,"Set["
 = 128+16+1,4,"]Set"
 = 128+16+2,2,"to"
 = 128+16+3,7,"Control"
 = 128+16+4,6,"TopBit"
 = 128+16+5,5,"Exact"
 = 128+16+6,4,"Case"
 = 0
 ALIGN
SETMARK BL TRAPC
 LDR R2,[AP,#START]
 LDR R1,[AP,#GS]
 SUB R1,R1,R2
 LDRB R2,[AP,#X]
 ADD R1,R1,R2
 LDRB R0,[AP,#MARKS]
 CMP R0,#0
 BEQ SETMARK1
CHECKMARK SUBS R0,R0,#1
 BCC SETMARK1
 ADD R3,AP,R0,LSL #2
 LDR R4,[R3,#MARKTB]
 CMP R1,R4
 BNE CHECKMARK
 CMP R0,#1 ;found same mark again: remove it
 BEQ REMOVE1MARK ;easy to remove the top mark of two
 LDRB R1,[AP,#MARKS]
 CMP R1,#1
 BEQ REMOVE1MARK ;similarly easy to remove top mark of one
 LDR R3,[AP,#MARKTB+4]
 STR R3,[AP,#MARKTB]
 MOV R0,#1
 STRB R0,[AP,#MARKS]
 MOV UPDATE,#FULLSCREEN+ABORT
 B EDITST
SETMARK1 LDRB R0,[AP,#MARKS]
 TEQ R0,#2
 BEQ TOOMARK
 ADD R3,AP,R0,LSL #2
 STR R1,[R3,#MARKTB] ;put in marktable
 ADD R0,R0,#1
REMOVE1MARK STRB R0,[AP,#MARKS]
 MOV UPDATE,#TOCRLONG+ABORT
 B EDITST
TOONEMK LDRB R1,[AP,#MARKS]
 CMP R1,#1
 MOVLE PC,R14
 STMFD SP!,{R14}
 BL PROMPT
 = "Only one mark is required: cursor to mark 1 or mark 2?",0
 BL CSRXY
 BL BIGCUR
 SWI READC
 BL NMLCUR
 BCS ESCAPE
 TEQ R0,#"1"
 TEQNE R0,#"2"
 BNE EDITST
 TEQ R0,#"2"
 LDREQ R1,[AP,#MARKTB+4]
 STREQ R1,[AP,#MARKTB]
 MOV R1,#1
 STRB R1,[AP,#MARKS]
 LDMFD SP!,{PC}
TOOMARK BL MSG
 = "Too many marks",0
 ALIGN
TWOMARK BL MSG
 = "Two marks (and cursor position) needed for this operation",0
 ALIGN
ONEMARK BL MSG
 = "One mark and cursor position needed for this operation",0
 ALIGN
MKCPY LDRB R0,[AP,#MARKS]
 CMP R0,#1
 BEQ TWOMARK
 BCC MKCPOT
 BL EDITVS
 LDR R7,[AP,#MARKTB+4]
 LDR R6,[AP,#MARKTB]
 CMP R6,R7
 BEQ EDITOR
 BL COPYSUB
 MOV UPDATE,#CSRONWARDS
 B EDITMT
MKCPOT ADD R9,ARGP,#AREA0
 TEQ R9,AP
 ADDEQ R9,ARGP,#AREA1
 LDRB R0,[R9,#ONSCREEN]
 TEQ R0,#1
 BEQ MKCPO0
 LDRB R0,[R9,#MARKS]
 CMP R0,#1
 BCC TWOMARK
 BNE MKCPOO
BADCOPY BL MSG
 = "Cannot copy from other window since only one mark is set",0
 ALIGN
MKCPOO BL PROMPT
 = "Copy from invisible window [Y,f7/N]",0
 MOV R3,#128+7
 BL YESNO1
 BL STATUS
MKCPO0 LDRB R0,[R9,#MARKS]
 CMP R0,#1
 BEQ BADCOPY
 BCC TWOMARK
 BL EDITVS
 LDR R7,[R9,#MARKTB+4]
 LDR R0,[R9,#MARKTB]
 CMP R0,R7
 BEQ EDITOR
 LDRCS R7,[R9,#MARKTB]
 LDRCS R0,[R9,#MARKTB+4]
 LDRB R1,[AP,#TASKQ]
 TEQ R1,#1
 BEQ MKCPOTASK
 SUB R1,R7,R0
 BL INSRTX
 LDR R6,[R9,#START]
 ADD R0,R6,R0
 ADD R7,R6,R7
MKCPO1 LDRB R6,[R0],#1
 STRB R6,[R4],#1
 TEQ R0,R7
 BNE MKCPO1
 MOV UPDATE,#CSRONWARDS
 B EDITMT
MKCPOTASK LDR R1,[R9,#START]
 ADD R6,R1,R0
 ADD R7,R1,R7
 BL TASKENTERSUB
 SUB R2,R2,#1
MKCPOTASK1 LDRB R0,[R6],#1
 STRB R0,[R2],#1
 TEQ R6,R7
 BNE MKCPOTASK1
 STRB R3,[R2]
 B EDITOR
OUTMARK BL NORMAL
 BL MSG
 = "Cursor position must not be in the marked area",0
 ALIGN
COPYSUB STMFD SP!,{R14}
 BL GPFINE
 LDR R7,[AP,#MARKTB+4]
 LDR R2,[AP,#MARKTB]
 CMP R2,R7
 BEQ MKCPYX
 LDRCS R7,[AP,#MARKTB]
 LDRCS R2,[AP,#MARKTB+4]
 MOV R4,R2 ;R2 is lower of two positions
 BL MARKADR
 MOV R6,R4
 MOV R4,R7
 BL MARKADR
 MOV R7,R4
 LDR R4,[AP,#GE]
 CMP R4,R6
 BLS MKCPY1
 CMP R4,R7
 BCC OUTMARK
MKCPY1 TEQ R4,R7
 LDREQ R7,[AP,#GS] ;get rid of possible problem
 SUB R1,R7,R6 ;number of chars
 LDRB R0,[AP,#TASKQ]
 TEQ R0,#1
 BEQ MKCPYTASK
 SUB R4,R4,R1 ;new GE
 LDR R3,[AP,#GS]
 CMP R4,R3
 BCC NOROOM
 STR R4,[AP,#GE]
MKCPY2 LDRB R0,[R6],#1
 STRB R0,[R4],#1
 TEQ R6,R7
 BNE MKCPY2
 LDR R6,[AP,#START]
 LDR R5,[AP,#GS]
 SUB R6,R5,R6
 CMP R2,R6
 LDRCS R2,[AP,#MARKTB]
 ADDCS R2,R2,R1
 STRCS R2,[AP,#MARKTB]
 LDRCS R2,[AP,#MARKTB+4]
 ADDCS R2,R2,R1
 STRCS R2,[AP,#MARKTB+4]
MKCPYX BL NORMAL
 LDMFD SP!,{PC}
MKCPYTASK BL TASKENTERSUB
 SUB R2,R2,#1
MKCPYTASK1 LDRB R0,[R6],#1
 STRB R0,[R2],#1
 TEQ R6,R7
 BNE MKCPYTASK1
 STRB R3,[R2]
 B MKCPYX
OLDTEXT BL MESSPOS
 LDR R7,[AP,#GE]
 LDR R6,[AP,#GS]
 SUB R7,R7,R6
 BL NUMOUT
 BL VSTRNG
 = " free",0
 BL QWIPE
 B EDITOR
TABKEY LDRB R0,[AP,#TABMOD]
 TEQ R0,#0
 BEQ TABSTR
 LDRB R0,[AP,#X]
 BIC R0,R0,#7
 ADD R0,R0,#8
 CMP R0,#WIDTH
 MOVEQ R0,#0
 STRB R0,[AP,#X]
 B EDITOR
TABSTR MOV R0,#1
 BL LINEBK
 LDRB R0,[AP,#X]
TABS1 CMP R0,#WIDTH-1
 BCS TABSSP
 LDRB R1,[R4,R0]
 CMP R1,#TERM
 BEQ TABSSP
 CMP R1,#" "
 ADD R0,R0,#1
 BNE TABS1
 B TABS2
TABSSP MOV R0,#0
TABS2 CMP R0,#WIDTH-1
 BCS TABSEX
 LDRB R1,[R4,R0]
 CMP R1,#" "
 ADDEQ R0,R0,#1
 BEQ TABS2
TABSEX STRB R0,[AP,#X]
 B EDITOR
CURLT LDRB R0,[AP,#X]
 SUBS R1,R0,#1
 STRB R1,[AP,#X]
 BCS EDITOR
 MOV R0,#WIDTH-1
 STRB R0,[AP,#X]
CURUP BL CMOVEU
 B EDITOR
CMOVEU STMFD SP!,{R14}
 LDR R0,[AP,#START]
 LDR R1,[AP,#GS]
 TEQ R0,R1
 LDMEQFD SP!,{PC}
 MOV R0,#1
 BL LINEBK
 BL GPBACK
 LDRB R0,[AP,#Y]
 LDRB R1,[AP,#TSM]
 CMP R1,R0
 BCS CMOVU1 ;inside margin: scroll
CMOVU2 LDRB R0,[AP,#Y]
 SUBS R2,R0,#1 ;if outside margin just move cursor position up
 STRCSB R2,[AP,#Y]
 LDMCSFD SP!,{PC}
CMOVU1 BL LINEBK ;check if possible to move up this number of lines
 TEQ R0,#0
 BNE CMOVU2 ;not possible so just move cursor up
 MOV UPDATE,#HARDDN+ABORT
 LDMFD SP!,{PC}
CURRT LDRB R0,[AP,#X]
 ADD R0,R0,#1
 STRB R0,[AP,#X]
 TEQ R0,#WIDTH
 BNE EDITOR
CURNL MOV R0,#0
 STRB R0,[AP,#X]
CURDWN BL CMOVED
 B EDITOR
;move cursor one line down and generate update type
CMOVED STMFD SP!,{R14}
 MOV R0,#1
 BL LINEFW
 TEQ R0,#0
 LDMNEFD SP!,{PC}
 BL GPFWD
 LDRB R5,[AP,#Y]
 LDRB R1,[AP,#BSM]
 ADD R2,R5,#1
 CMP R5,R1
 STRCCB R2,[AP,#Y] ;if outside margin, easy!
 MOVCS UPDATE,#HARDUP+ABORT ;else move screen
 LDMFD SP!,{PC}
CRTOGGLE LDRB R0,[AP,#SHOWCR]
 EOR R0,R0,#1
 STRB R0,[AP,#SHOWCR]
 MOV UPDATE,#FULLSCREEN
 B EDITOR
IOTOGGLE LDRB R0,[AP,#INSERT]
 EOR R0,R0,#1
 STRB R0,[AP,#INSERT]
EDITST BL STATUS
 B EDITOR
INSRTF BL DISPC2 ;REALLY display the cursor
 BL PROMPT
 = "Type filename to insert:",0
 BL READFL
 BL PROMPT
 = "Inserting ",0
 BL WRITNAM
 MOV R0,#5
 SWI FILE
 TEQ R0,#1
 BNE INSRTG
 MOV R1,R4 ;length of file
 BL INSRTX
 MOV R2,R4 ;address to start insert
INSRTG MOV R0,#&FF
 ADD R1,ARGP,#STRACC
 MOV R3,#0
 SWI FILE
 BL SCRIMI
FULLMOD MOV R0,#1
FULLMD LDRB UPDATE,[AP,#MODIFY] ;Fullscreen update and modified
 TEQ UPDATE,#4
 STRNEB R0,[AP,#MODIFY]
 MOV UPDATE,#FULLSCREEN
 B EDITST
MARGINS BL PROMPT
 = "set Bottom margin, set Top margin or Remove margins ? [B/R/T]",0
 BL CSRXY
MARGN1 SWI READC
 BCS EDITST
 BIC R0,R0,#32
 TEQ R0,#"B"
 BEQ SETBSM
 TEQ R0,#"T"
 BEQ SETTSM
 TEQ R0,#"R"
 BNE MARGN1
 MOV R0,#0
 STRB R0,[AP,#TSM]
 LDRB R0,[AP,#ELINE]
 LDRB R1,[AP,#SLINE]
 SUB R0,R0,R1
 SUB R0,R0,#1
 STRB R0,[AP,#BSM]
 B EDITST
SETTSM LDRB R0,[AP,#Y]
 STRB R0,[AP,#TSM]
 B EDITST
SETBSM LDRB R0,[AP,#Y]
 STRB R0,[AP,#BSM]
 B EDITST
RETLANG LDRB R0,[ARGP,#TASK]
 TEQ R0,#0
 BEQ RETLN2
 BL PROMPT
 = "There is a background task running: do you really want to exit? [shf-f4,Y/N]:",0
 MOV R3,#128+16+4
 BL YESNO1
RETLN2 LDRB R0,[ARGP,#CALLER]
 TEQ R0,#0
 BEQ RETLN3
 BL PROMPT
 = "Return to ",0
 ADD R0,ARGP,#CALLER
 SWI WRITE0
 BL SELREV
 SWI WRITES
 = " [Y (RETURN)/N]",0
 BL SELFWD
 SWI READC
 BCS ESCAPE
 TEQ R0,#"Y"
 TEQNE R0,#"y"
 TEQNE R0,#13
 BNE RETLN3
 ADD R0,ARGP,#CALLER
 ADD R1,ARGP,#STRACC
RETLN4 LDRB R4,[R0],#1
 STRB R4,[R1],#1
 TEQ R4,#0
 BNE RETLN4
 SUB R1,R1,#1
 B RETLOW
RETLN3 ADD R6,ARGP,#AREA0
 ADD R7,ARGP,#AREA1
 LDRB R0,[R6,#PUSHNO]
 LDRB R1,[R7,#PUSHNO]
 ORR R0,R0,R1
 TEQ R0,#"0"
 BEQ RETLNPUSH1
 BL PROMPT
 = "There are Pushed buffers, do you really want to exit? [shf-f4,Y/N]:",0
 MOV R3,#128+16+4
 BL YESNO1
 ADD R6,ARGP,#AREA0
 ADD R7,ARGP,#AREA1
 LDRB R0,[R6,#MODIFY]
 LDRB R1,[R7,#MODIFY]
 ORR R0,R0,R1
 TST R0,#1
 BEQ RETLN1
 BL PROMPT
 = "Modified buffers exist, do you really want to exit? [shf-f4,Y/N]:",0
 MOV R3,#128+16+4
 BL YESNO1
 B RETLN1
RETLNPUSH1 BL APTOBUFF
 BL OTHERAP
 BL APTOBUFF
 BL OTHERAP
 ADD R8,ARGP,#ENDIT
 MOV R9,#0
 BL PROMPT
 = "Modified buffers: ",0
 BL SCRIMI
RETLNBUFFS LDRB R0,[R8,#MODIFY]
 TST R0,#1
 BEQ RETLNBUFFS1
 MOV R9,#1
 SWI NEWLINE
 LDRB R0,[R8,#BUFFNO]
 SWI WRITEC
 SWI WRITES
 = " -> ",0
 ADD R1,R8,#NAMBUFF
RETLNBUFFS2 LDRB R0,[R1],#1
 CMP R0,#" "
 SWICS WRITEC
 BCS RETLNBUFFS2
RETLNBUFFS1 LDRB R0,[R8,#BUFFNO]
 BL BUFFSUB
 CMP R0,#"9"
 BCC RETLNBUFFS
 CMP R9,#0
 BEQ RETLN1
 SWI NEWLINE
 BL SELREV
 SWI WRITES
 = "Do you really want to exit? [shf-f4,Y/N]:",0
 BL SELFWD
 MOV R3,#128+16+4
 BL YESNO1
RETLN1 BL PROMPT
 = "Return to which language:",0
 BL READLRNOCOPY
 SUB R4,R1,ARGP
 TEQ R4,#STRACC
 BNE RETLOW
 BL INITUS
 BL RETSCR
 SWI EXIT
 B RETFAIL
RETSCR SWI WRITEI+26
 SWI WRITEI+31
 SWI WRITEI+0
 LDRB R0,[ARGP,#MAXY]
 SWI WRITEC
 SWI NEWLINE
 MOV PC,R14
RETLOW STMFD SP!,{R1}
 LDR R4,[AP,#START]
 BL GPBACK
 LDMFD SP!,{R1}
 MOV R0,#" "
 STRB R0,[R1],#1
 MOV R0,#"@"
 STRB R0,[R1],#1
 LDR R4,[AP,#GE]
 BL EDITHX
 MOV R0,#","
 STRB R0,[R1],#1
 LDR R4,[AP,#END]
 BL EDITHX
 MOV R0,#0
 STRB R0,[R1],#1
 BL INITUS
 BL RETSCR
 ADD R0,ARGP,#STRACC
 SWI CLI
RETFAIL BL INITED
 MOV UPDATE,#THELOT
 B EDITAL
EDITHX MOV R2,#32-4 ;covert R4 to string ptd to by r1
EDITLP MOV R0,R4,LSR R2
 AND R0,R0,#15
 CMP R0,#9
 ORRLS R0,R0,#"0"
 ADDHI R0,R0,#"A"-10
 STRB R0,[R1],#1
 SUBS R2,R2,#4
 BPL EDITLP
 MOV PC,R14

 LNK Command2
